//
//  JHomeTableVC.swift
//  JMicroBlog
//
//  Created by Jason on 18/5/15.
//  Copyright (c) 2015 Shepherd. All rights reserved.
//

import UIKit

// MARK: - 首页控制器类
class JHomeTableVC: JBaseTableVC {

    // MARK: - 属性
    @IBOutlet weak var titleBtn: JTitleBtn!

    // 
    let photoBrowserAnimator = JPhotoBrowserAnimator()
    let animatorDelegate = JPopoverAnimator()
    
    /**
     * 线程安全
     * 使用方法上与NSDictionary几乎一致
     * 当内寸不足时会自动清理掉
     * 一旦缓存的对象被清除 需要重新计算 NSCache对象是不稳定的
     */
    var rowHeightCache = NSCache()
    
    // 扫描二维码按钮响应事件
    @IBAction func qrCode() {
        presentViewController(UIStoryboard.initialViewController("JQRCode"), animated: true, completion: nil)
        
    }
    // 微博对象数组
    var statusList : [JStatus]? {
        didSet {
            // 刷新数据
            tableView.reloadData()
            
            // 关闭刷新控件
            refreshControl?.endRefreshing()
        }
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // 设置标题
        setTitleBtn()
        if !isLogin {
            return
        }
        // 加载数据
//        loadData()
        setUpControlRefresh()
    }
    
    // 手动创建UIControlRefresh控件
    private func setUpControlRefresh() {
        refreshControl = JRefreshControl()
        
        // 设置监听方法
        refreshControl?.addTarget(self, action: "loadData", forControlEvents: UIControlEvents.ValueChanged)
        loadData()
    }
    // MARK: - 数据处理
    
    /** 加载数据 
        since_id 返回id比since_id大的微博信息
    */
    var pullRefreshFlag = false // 是否是上拉刷新
    @IBAction func loadData() {
        // 指示器进入刷新状态
        self.refreshControl?.beginRefreshing()
        // 得到第一条微博信息,如果第一次就只管得到20条数据
        var since_id = statusList?.first?.id ?? 0
        var max_id = 0
        if pullRefreshFlag {
            since_id = 0
            max_id = statusList?.last?.id ?? 0
        }
        JStatus.loadStatuses(since_id: since_id, max_id: max_id) { (statuses) -> () in
            JLog.i("\(statuses)",false)
//            if statuses?.count == 0 {
            if statuses == nil {
                JLog.i("没有新数据")
                self.refreshControl?.endRefreshing()
                return
            }
            
            /*
             如果是since_id = 0 表示没有新数据 直接赋值即可
             否则 将新得到的数据 添加到statusList数组的前面
             */
            if since_id > 0 {
                self.statusList = statuses! + self.statusList!
            } else if max_id > 0 {
                self.statusList! += statuses!
                self.pullRefreshFlag = false
                JLog.i("上拉刷新")
            } else {
                self.statusList = statuses
            }
            JLog.i(self.statusList,false)
        }
    }
    
    
    // 设置首页标题
    private func setTitleBtn() {
        if sharedUserInfo?.name != nil {
            titleBtn.setTitle(sharedUserInfo!.name! + " ", forState: UIControlState.Normal)
        } else {
            titleBtn.setImage(nil, forState: UIControlState.Normal)
        }
    }
    
    // 视图跳转 (用storyboard进行跳转时被调用,起衔接作用)
    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if segue.identifier == "Home2Popover" {
            let popoverVC = segue.destinationViewController as! JPopoverVC
            JLog.i("--------",false)
            // transition转场,过渡的意思,从一个界面跳到另一个界面
            popoverVC.transitioningDelegate = animatorDelegate
            
            // 设置展现控制器的大小
            // 水平居中
            let x = (view.bounds.width - 200) * 0.5
            animatorDelegate.presentFrame = CGRectMake(x, 56, 200, 240)
            
            // The presentation style for modally presented view controllers
            popoverVC.modalPresentationStyle = UIModalPresentationStyle.Custom
        }
    }
    
    override func viewDidAppear(animated: Bool) {
        super.viewDidAppear(animated)
        visitorLoginView?.setInfo("visitordiscover_feed_image_house", "关注一些人,回来看看就有惊喜",true)
    }
    
    // MARK: - tableView的数据源方法
    
    // 每组有多少个cell
    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return statusList?.count ?? 0
    }
    
    // 每个cell的内容
    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let reuseId = JStatusCell.cellReuseId(statusList![indexPath.row])
        let cell = tableView.dequeueReusableCellWithIdentifier(reuseId) as! JStatusCell
        
        // 可选型使用数组下标 一定要解包
        cell.status = statusList![indexPath.row]
        
        // 成为代理对象
        cell.pictureDelegate = self
        
        /**
           当最后一个cell被显示时,修改上拉刷新标记 并刷新数据
          */
        if indexPath.row == statusList!.count - 1 && !pullRefreshFlag {
            // 设置标记
            pullRefreshFlag = true
            
            // 刷新数据
            loadData()
        }
        
        return cell
    }
    
    /***  估算行高 */
    override func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
        return 300
    }
    
    // 计算行高
    override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
        // 根据微博数据计算行高
        
        // 1.取出数据
        let status = statusList![indexPath.row]
        
        // 判断是否已经被缓存
        if rowHeightCache.objectForKey(status.id) != nil {
            JLog.i("返回缓存行高",false)
            return rowHeightCache.objectForKey(status.id) as! CGFloat
        }
        // 2.取出一个cell
        let cell = tableView.dequeueReusableCellWithIdentifier(JStatusCell.cellReuseId(status)) as! JStatusCell
        // 3.返回行高
        let height = cell.rowHeight(status)

        rowHeightCache.setObject(height, forKey: status.id)
        
        return height
    }
}

// MARK: - 遵守JStatusCellDelegate协议
extension JHomeTableVC : JStatusCellDelegate {
    // 实现代理方法
    func statusCellDidSelectedPicture(cell: JStatusCell, pictureCell: PictureCell, index: Int) {
        JLog.i(cell.status?.largePicURLs, false)
        // 这里使用纯代码开发方式
        let browser = JPhotoBrowserVC()
        // 设置图片数组
        browser.imgURLs = cell.status?.largePicURLs
        // 
        photoBrowserAnimator.dummyView = pictureCell.snapshotViewAfterScreenUpdates(false)
        
        // 坐标系转换 - 不同坐标系对同一个点的描述
        // 1 > 相对于collectionView的坐标
        var rect = pictureCell.frame
        JLog.i("\(rect)",false)
        // 2 >
        rect = cell.convertRect(rect, fromView: cell.collectionView)
        JLog.i("\(rect)",false)
        //
        rect = view.convertRect(rect, fromView: cell)
        // 修正contentOffset
        rect = CGRectOffset(rect, 0, -tableView.contentOffset.y)
        // 设置dummy初始位置
        photoBrowserAnimator.dummyView.frame = rect
        
        photoBrowserAnimator.dummyViewStart = rect
        photoBrowserAnimator.dummyViewEnd = scaleImageRect(pictureCell.imgView.image!)
        // 设置选中的照片索引
        browser.index = index
        
        // 设置 Modal 转场代理
        browser.transitioningDelegate = photoBrowserAnimator
        // 弹出照片浏览控制器
        presentViewController(browser, animated: true, completion: nil)
    }
    // 计算目标位置
    private func scaleImageRect(image : UIImage) -> CGRect {
        // 水平缩放的比例
        let wScale = image.size.width / view.bounds.size.width
        var height = image.size.height / wScale
        var y : CGFloat = 0
        // 1.长图
        if height > view.bounds.height {
            height = view.bounds.height
        } else {
            y = (view.bounds.height - height) * 0.5
        }
        return CGRectMake(0, y, view.bounds.width, height)
    }
}